<?php
use think\Loader;
function demo($a){
	return $a*10000;
}
 /*************************以下便捷函数************************/
/**
 * 便捷输出。数组则打印，字符串则直接输出
 * $content 数组或字符串
 */
function show($content){
	if(is_string($content)){
		echo $content.'<br/>';
	}else{
		echo '<pre style="color:red">';
		print_r($content);
		echo '</pre>';
	}
}
/**
 * 字符串截取，支持中文和其他编码
 */
function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true) {
	if (function_exists("mb_substr"))
		$slice = mb_substr($str, $start, $length, $charset);
	elseif (function_exists('iconv_substr')) {
		$slice = iconv_substr($str, $start, $length, $charset);
		if (false === $slice) {
			$slice = '';
		}
	} else {
		$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
		$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
		$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
		$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
		preg_match_all($re[$charset], $str, $match);
		$slice = join("", array_slice($match[0], $start, $length));
	}
	return $suffix ? $slice . '...' : $slice;
}
/**
 * 写入文件，追加写入
 */
function writeF(){
	$num=func_num_args();			//获取传入参数个数
	$filename=func_get_arg(0);		//获取参数的第一个值
	$filename=!empty($filename)?$filename:'demo.txt';
	$str='';
	for($i=1;$i<$num;$i++){
		if(is_array(func_get_arg($i))){
			$str.="======================================\r\n";
			foreach(func_get_arg($i) as $key=>$val){
				$str.='键名：'.$key.'==>'.$val."\r\n";
			}
			$str.="======================================\r\n";
		}elseif(is_object(func_get_arg($i))){
			$str.="**************************************\r\n";
			foreach(func_get_arg($i) as $key=>$val){
				$str.='属性：'.$key.'==>'.$val."\r\n";
			}
			$str.="**************************************\r\n";
		}else{
			$str.=func_get_arg($i)."\r\n";
		}
	}
	return file_put_contents($filename, $str,FILE_APPEND);//, FILE_APPEND);
}
/**
 * 写入文件，覆盖写入
 */
function writeF2(){
	$num=func_num_args();			//获取传入参数个数
	$filename=func_get_arg(0);		//获取参数的第一个值
	$filename=!empty($filename)?$filename:'demo.txt';
	$str='';
	for($i=1;$i<$num;$i++){
		if(is_array(func_get_arg($i))){
			$str.="======================================\r\n";
			foreach(func_get_arg($i) as $key=>$val){
				$str.='键名：'.$key.'==>'.$val."\r\n";
			}
			$str.="======================================\r\n";
		}elseif(is_object(func_get_arg($i))){
			$str.="**************************************\r\n";
			foreach(func_get_arg($i) as $key=>$val){
				$str.='属性：'.$key.'==>'.$val."\r\n";
			}
			$str.="**************************************\r\n";
		}else{
			$str.=func_get_arg($i)."\r\n";
		}
	}
	return file_put_contents($filename, $str);//, FILE_APPEND);
}
function rel($code,$msg,$rel=[]){
	return ['code'=>$code,'msg'=>$msg,'result'=>$rel];
}
/**************************以下二维码相关函数***************************************/
/**
 * 生成二维码并保存，返回保存的文件完整路径
 * @param $url	    	字符串参数
 * @param $name  		保存的文件名称（不带后缀）
 * @param $path  		保存的路径
 * @param $errorLevel	容差值
 * @param $sice			大小
 */
function putQrcode($url,$name='',$path='',$errorLevel='L',$size=6){
	Loader::import('phpqrcode.phpqrcode', EXTEND_PATH);
	$time=time();
	$name=!empty($name) ? $name.'.png' : 'qrcode'.$time.'.png';
	$path=!empty($path) ? $path : '/qrcode/'.date('Ymd',$time);
	makeDir(UPLOAD_PATH.'/uploads'.$path);
	$filename=UPLOAD_PATH.'/uploads'.$path.'/'.$name;
	
	//生成二维码图片   
	QRcode::png($url, $filename, $errorLevel, $size, 2);
	return $path.'/'.$name;
}
/**
 * 生成二维码但不保存，返回base64图片字符串
 * @param $url	    	字符串参数
 * @param $errorLevel	容差值
 * @param $sice			大小
 */
function putQrcodeWeb($url,$errorLevel='L',$size=6){
	Loader::import('phpqrcode.phpqrcode', EXTEND_PATH);
    //打开缓冲区
    ob_start();
    //生成二维码图片   
	QRcode::png($url, false, $errorLevel, $size, 2);
    //这里就是把生成的图片流从缓冲区保存到内存对象上，使用base64_encode变成编码字符串，通过json返回给页面。
    $imageString = base64_encode(ob_get_contents());
    //关闭缓冲区
    ob_end_clean();
	return $imageString;
}
//参数1二维码内容
function putLogoQrcode($contents){
	Loader::import('phpqrcode.phpqrcode', EXTEND_PATH);
	$errorCorrectionLevel = 'L';//容错级别   
	$matrixPointSize = 6;//生成图片大小   
	//生成二维码图片   
	QRcode::png($contents, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2);   
	$logo = 'logo.png';//准备好的logo图片   
	$QR = 'qrcode.png';//已经生成的原始二维码图   
	
	if ($logo !== FALSE) {   
	    $QR = imagecreatefromstring(file_get_contents($QR));   
	    $logo = imagecreatefromstring(file_get_contents($logo));   
	    $QR_width = imagesx($QR);//二维码图片宽度   
	    $QR_height = imagesy($QR);//二维码图片高度   
	    $logo_width = imagesx($logo);//logo图片宽度   
	    $logo_height = imagesy($logo);//logo图片高度   
	    $logo_qr_width = $QR_width / 5;   
	    $scale = $logo_width/$logo_qr_width;   
	    $logo_qr_height = $logo_height/$scale;   
	    $from_width = ($QR_width - $logo_qr_width) / 2;   
	    //重新组合图片并调整大小   
	    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);   
	}   
	//输出图片   
	imagepng($QR, 'helloweixin.png');   
	echo '<img src="helloweixin.png">';
}
/**
 * 按照给予的尺寸，真实裁剪图片，没有返回值，生成缩略图路径名称即为引用图片的地址
 * @param $source_path		原图的路径，带图片的名称
 * @param $NewImagePath		生成缩略图路径，带保存的图片名称
 * @param $target_width		缩略图宽度，单位px
 * @param $target_height	缩略图高度，单位px
 */
function getCropper($source_path,$NewImagePath, $target_width, $target_height){
    $source_info   = getimagesize($source_path);
    $source_width  = $source_info[0];
    $source_height = $source_info[1];
    $source_mime   = $source_info['mime'];
    $source_ratio  = $source_height / $source_width;
    $target_ratio  = $target_height / $target_width;

    // 源图过高
    if ($source_ratio > $target_ratio){
        $cropped_width  = $source_width;
        $cropped_height = $source_width * $target_ratio;
        $source_x = 0;
        $source_y = ($source_height - $cropped_height) / 2;
    }elseif ($source_ratio < $target_ratio){// 源图过宽
        $cropped_width  = $source_height / $target_ratio;
        $cropped_height = $source_height;
        $source_x = ($source_width - $cropped_width) / 2;
        $source_y = 0;
    }else{// 源图适中
        $cropped_width  = $source_width;
        $cropped_height = $source_height;
        $source_x = 0;
        $source_y = 0;
    }

    switch ($source_mime){
        case 'image/gif':
            $source_image = imagecreatefromgif($source_path);
            break;
        case 'image/jpeg':
            $source_image = imagecreatefromjpeg($source_path);
            break;
        case 'image/png':
            $source_image = imagecreatefrompng($source_path);
            break;
        default:
            return false;
            break;
    }

    $target_image  = imagecreatetruecolor($target_width, $target_height);
    $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height);

    // 图片裁剪
    imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);
    // 图片缩放
    imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $target_width, $target_height, $cropped_width, $cropped_height);

    header('Content-Type: image/jpeg');
    imagejpeg($target_image,$NewImagePath,100);
    imagedestroy($source_image);
    imagedestroy($target_image);
    imagedestroy($cropped_image);
}
/**
 * 保持图片原始大小比例，不够的地方用白边补充
 * @param $source_path		原图的路径，带图片的名称
 * @param $NewImagePath		生成缩略图路径，带保存的图片名称
 * @param $target_width		缩略图宽度，单位px
 * @param $target_height	缩略图高度，单位px
 * @param $rgb				填充颜色
 */
function getCrops($src_path,$NewImagePath,$width,$height,$rgb=[255,255,255]){
    //源图对象
    $src_image = imagecreatefromstring(file_get_contents($src_path));
    $source_info   = getimagesize($src_path);
    $source_mime   = $source_info['mime'];
    $src_width = imagesx($src_image);
    $src_height = imagesy($src_image);

    switch ($source_mime){
        case 'image/gif':
            $src_image = imagecreatefromgif($src_path);
            break;
        case 'image/jpeg':
            $src_image = imagecreatefromjpeg($src_path);
            break;
        case 'image/png':
            $src_image = imagecreatefrompng($src_path);
            break;
        default:
            return false;
            break;
    }

    //生成等比例的缩略图
    //$tmp_image_width = 0;
    //$tmp_image_height = 0;
    if ($src_width / $src_height >= $width / $height) {
        $tmp_image_width = $width;
        $tmp_image_height = round($tmp_image_width * $src_height / $src_width);

    } else {
        $tmp_image_height = $height;
        $tmp_image_width = round($tmp_image_height * $src_width / $src_height);
    }

    $tmpImage = imagecreatetruecolor($tmp_image_width, $tmp_image_height);
    imagecopyresampled($tmpImage, $src_image, 0, 0, 0, 0, $tmp_image_width, $tmp_image_height, $src_width, $src_height);

    //添加白边
    $final_image = imagecreatetruecolor($width, $height);
    $r=$rgb[0];
    $g=$rgb[1];
    $b=$rgb[2];
    $color = imagecolorallocate($final_image, $r, $g, $b);
    imagefill($final_image, 0, 0, $color);
    $x = round(($width - $tmp_image_width) / 2);
    $y = round(($height - $tmp_image_height) / 2);
    imagecopy($final_image, $tmpImage, $x, $y, 0, 0, $tmp_image_width, $tmp_image_height);

    //输出图片
    header('Content-Type: image/jpeg');
    imagejpeg($final_image,$NewImagePath,100);
    imagedestroy($src_image);
    imagedestroy($final_image);
}
/**************************以上二维码相关函数***************************************/
/**************************以下数组函数***************************************/
function urlParam($query) {   
	$queryParts = explode('&', $query);   
	$params = array();   
	foreach ($queryParts as $param) {     
		$item = explode('=', $param);     
		$params[$item[0]] = $item[1];   
	}   
	return $params; 
}
/**
 * 将二维数组，按照指定数字组合成三维数组
 * @param $arr	待处理数组
 * @param $num	指定多少个为一组
 * @param $fulle 是否补全，0不补全，则最后一个元素个数为余数
 */
function arr_group_by_num($array,$num,$full=0){
	$rel=[];
	while($array){
		$arr=$array;
		$array=array_splice($arr,$num);
		$rel[]=$arr;	
	}
	if($full && !empty($rel)){
		$count=count($rel);
		$end=$rel[$count-1];	//最后一个元素
		$x=$num-count($end);
		if($x!=0){
			for($i=0;$i<$x;$i++){
				$end[]=[];	
			}
			$rel[$count-1]=$end;
		}
	}
	return $rel;
}
/**
 * 将二位索引数组，按照其中的一个键名进行分组
 * 注意：键名只指向一个一维数组
 * @param $arr	待二位索引数组
 * @param $key_name
 * @return array
 * 将数据库中查出的列表以指定的 id 作为数组的键名 
 */
function arr_cate($arr, $key_name){
	$arr2 = array();
	foreach($arr as $key => $val){
		$arr2[$val[$key_name]] = $val;        
	}
	return $arr2;
}

/**
 * 将二维数组，根据某一个键进行分组
 */
//function arr_cate($arr,$key){
//	$keys=[];				
//	$rel=[];
//	foreach($arr as $item){
//		if(!in_array($item[$key], $keys)){
//			array_push($keys,$item[$key]);
//			$rel[$item[$key]]=$item;
//		}else{
//			$rel[$item[$key]]=$item;
//		}
//	}
//	return $rel;
//}

/**
 * 将二维数组以元素的某个值作为键 并归类数组
 * 注意：键名都会指向一个二维数组
 * array( array('name'=>'aa','type'=>'pay'), array('name'=>'cc','type'=>'pay') )
 * array('pay'=>array( array('name'=>'aa','type'=>'pay') , array('name'=>'cc','type'=>'pay') ))
 * @param $arr 数组
 * @param $key 分组值的key
 * @return array
 */
function arrs_cate($arr,$key){
    $new_arr = array();
    foreach($arr as $k=>$v ){
        $new_arr[$v[$key]][] = $v;
    }
    return $new_arr;
}
//function arrs_cate($arrs,$key){
//	$keys=[];				
//	$rel=[];
//	foreach($arrs as $item){
//		if(!in_array($item[$key], $keys)){
//			array_push($keys,$item[$key]);
//			$rel[$item[$key]][]=$item;
//		}else{
//			$rel[$item[$key]][]=$item;
//		}
//	}
//	return $rel;
//}
/**
 * 将数据库中查出的列表以指定的 id 作为数组的键名 数组指定列为元素 的一个数组
 * @param $arr	待二维数组
 * @param $key_name 指定的原数组中元素，作为新数组的一维索引键名
 * @param $key_name2 指定的原数组中的元素，作为新数组的一维值
 * @return array
 */
function get_id_val($arr, $key_name,$key_name2){
	$arr2 = array();
	foreach($arr as $key => $val){
		$arr2[$val[$key_name]] = $val[$key_name2];
	}
	return $arr2;
}
/**
 * 删除索引数组中指定的键对应的值
 * @param $arr 待一维数组
 * @param $keyArr 原素组中的键名数组
 */
function delArrVal($arr,$keyArr){
	foreach($keyArr as $item){
		unset($arr[$item]);
	}
	return $arr;
}
/**
 * 获取数组中的某一列
 * @param type $arr 数组
 * @param type $key_name  列名
 * @return type  返回那一列的数组
 */
function get_arr_column($arr, $key_name){
	$arr2 = array();
	foreach($arr as $key => $val){
		$arr2[] = $val[$key_name];        
	}
	return $arr2;
}
/**
 * 获取url 中的各个参数  类似于 pay_code=alipay&bank_code=ICBC-DEBIT
 * @param type $str
 * @return type
 */
function parse_url_param($str){
    $data = array();
    $str = explode('?',$str);
    $str = end($str);
    $parameter = explode('&',$str);
    foreach($parameter as $val){
        $tmp = explode('=',$val);
        $data[$tmp[0]] = $tmp[1];
    }
    return $data;
}
/**
 * 二维数组排序
 * @param $arr
 * @param $keys
 * @param string $type
 * @return array
 */
function array_sort($arr, $keys, $type = 'desc'){
    $key_value = $new_array = array();
    foreach ($arr as $k => $v) {
        $key_value[$k] = $v[$keys];
    }
    if ($type == 'asc') {
        asort($key_value);
    } else {
        arsort($key_value);
    }
    reset($key_value);
    foreach ($key_value as $k => $v) {
        $new_array[$k] = $arr[$k];
    }
    return $new_array;
}
/**
 * 多维数组转化为一维数组
 * @param 多维数组
 * @return array 一维数组
 */
function array_multi2single($array){
    static $result_array = array();
    foreach ($array as $value) {
        if (is_array($value)) {
            array_multi2single($value);
        } else
            $result_array [] = $value;
    }
    return $result_array;
}
/**
 * 多个数组的笛卡尔积
*
* @param unknown_type $data
*/
function combineDika() {
	$data = func_get_args();
	$data = current($data);
	$cnt = count($data);
	$result = array();
    $arr1 = array_shift($data);
	foreach($arr1 as $key=>$item){
		$result[] = array($item);
	}		

	foreach($data as $key=>$item){                                
		$result = combineArray($result,$item);
	}
	return $result;
}

/**
 * 两个数组的笛卡尔积
 * @param unknown_type $arr1
 * @param unknown_type $arr2
*/
function combineArray($arr1,$arr2) {		 
	$result = array();
	foreach ($arr1 as $item1){
		foreach ($arr2 as $item2){
			$temp = $item1;
			$temp[] = $item2;
			$result[] = $temp;
		}
	}
	return $result;
}
/**
 * 过滤数组元素前后空格 (支持多维数组)
 * @param $array 要过滤的数组
 * @return array|string
 */
function trim_array_element($array){
    if(!is_array($array))
        return trim($array);
    return array_map('trim_array_element',$array);
}
function order_no(){
	return date('YmdHis').rand(1000,9999); // 订单编号
}
/****************************以下字符串函数*********************************/
function safe($val){
	return str_replace(' ','',$val);
}
/**
 * 实现中文字串截取无乱码的方法
 * @param $string		待截取字符串
 * @param $length		截取的长度
 * @param $start		从什么位置开始截取，默认从头开始
 */
function getSubstr($string, $length, $start=0) {
	if(mb_strlen($string,'utf-8')>$length){
	    $str = mb_substr($string, $start, $length,'utf-8');
	    return $str.'...';
	}else{
	    return $string;
	}
}
/** 
 * 大写英文字母递增 
 *  
 * chr() 函数从指定的 ASCII 值返回字符 
 * ord() 函数返回字符串第一个字符的 ASCII 值 
 *  
 * @param string $str A-Z的英文字母 
 * @return string 
 */  
function AZIncrement($str){
    $str = strtoupper($str);
    $str = ord($str);
    if ($str < 65 || $str > 90) return '你传过来的是什么鬼！';  
    if ($str == 90) return '已经是 Z 啦！';  
    return chr($str+1);
}
/**
 * 获取字母自增的数组，最大值ZZ
 */
function getAZ702($num=702){
	if($num>702) return false;
	$rel=[];
	$x='';
	$dong='A';
	for($i=0;$i<$num;$i++){
		$rel[]=$x.$dong;
		if($dong!='Z'){
			$dong=AZIncrement($dong);
		}else{
			$dong='A';
			if(empty($x)){
				$x='A';
			}else{
				$x=AZIncrement($x);
			}
		}
	}
	return $rel;
}
/**
 * 生成由纯数字组成的订单号
 */
function order_code(){
	return date('YmdHi') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}

/**
 * 获取随机字符串
 * @param int $randLength  长度
 * @param int $addtime  是否加入当前时间戳
 * @param int $includenumber   是否包含数字
 * @return string
 */
function get_rand_str($randLength=6,$includenumber=1,$addtime=0){
    if ($includenumber){
        $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQEST123456789';
    }else {
        $chars='abcdefghijklmnopqrstuvwxyz';
    }
    $len=strlen($chars);
    $randStr='';
    for ($i=0;$i<$randLength;$i++){
        $randStr.=$chars[rand(0,$len-1)];
    }
    $tokenvalue=$randStr;
    if ($addtime){
        $tokenvalue=$randStr.time();
    }
    return $tokenvalue;
}
function randomkeys($length){
   $pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
   $key = ''; 
    for($i=0;$i<$length-1;$i++){   
        $key .= $pattern{mt_rand(0,35)};    //生成php随机数   
    }   
    return $key;   
}
function nonce_str($length=32){
	$string='abcdefghijklmnopqrstuvwxyz0123456789';
	$str='';
	for($i=0;$i<$length;$i++){
		$str.=$string{mt_rand(0,32)};
	}
	return $str;
} 
//生成随机码
function doVerify( $length = 6 ) {
	// 密码字符集，可任意添加你需要的字符
	$chars = '0123456789';
	$verify = '';
	for ( $i = 0; $i < $length; $i++ )	{
		// 这里提供两种字符获取方式
		// 第一种是使用 substr 截取$chars中的任意一位字符；
		// 第二种是取字符数组 $chars 的任意元素
		// $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
		$verify .= $chars[ mt_rand(0, strlen($chars) - 1) ];
	}
	return $verify;
}
//php获取中文字符拼音首字母
function getFirstCharter($str){
      if(empty($str)){
            return '';          
      }
      $fchar=ord($str{0});
      if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0});
      $s1=iconv('UTF-8','gb2312',$str);
      $s2=iconv('gb2312','UTF-8',$s1);
      $s=$s2==$str?$s1:$str;
      $asc=ord($s{0})*256+ord($s{1})-65536;
     if($asc>=-20319&&$asc<=-20284) return 'A';
     if($asc>=-20283&&$asc<=-19776) return 'B';
     if($asc>=-19775&&$asc<=-19219) return 'C';
     if($asc>=-19218&&$asc<=-18711) return 'D';
     if($asc>=-18710&&$asc<=-18527) return 'E';
     if($asc>=-18526&&$asc<=-18240) return 'F';
     if($asc>=-18239&&$asc<=-17923) return 'G';
     if($asc>=-17922&&$asc<=-17418) return 'H';
     if($asc>=-17417&&$asc<=-16475) return 'J';
     if($asc>=-16474&&$asc<=-16213) return 'K';
     if($asc>=-16212&&$asc<=-15641) return 'L';
     if($asc>=-15640&&$asc<=-15166) return 'M';
     if($asc>=-15165&&$asc<=-14923) return 'N';
     if($asc>=-14922&&$asc<=-14915) return 'O';
     if($asc>=-14914&&$asc<=-14631) return 'P';
     if($asc>=-14630&&$asc<=-14150) return 'Q';
     if($asc>=-14149&&$asc<=-14091) return 'R';
     if($asc>=-14090&&$asc<=-13319) return 'S';
     if($asc>=-13318&&$asc<=-12839) return 'T';
     if($asc>=-12838&&$asc<=-12557) return 'W';
     if($asc>=-12556&&$asc<=-11848) return 'X';
     if($asc>=-11847&&$asc<=-11056) return 'Y';
     if($asc>=-11055&&$asc<=-10247) return 'Z';
     return null;
}
/**
 * 获取整条字符串汉字拼音首字母
 * @param $zh
 * @return string
 */
function pinyin_long($zh){
    $ret = "";
    $s1 = iconv("UTF-8","gb2312", $zh);
    $s2 = iconv("gb2312","UTF-8", $s1);
    if($s2 == $zh){$zh = $s1;}
    for($i = 0; $i < strlen($zh); $i++){
        $s1 = substr($zh,$i,1);
        $p = ord($s1);
        if($p > 160){
            $s2 = substr($zh,$i++,2);
            $ret .= getFirstCharter($s2);
        }else{
            $ret .= $s1;
        }
    }
    return $ret;
}
/**
 * 超过指定长度的字符串，用标识符替换成指定长度
 * @param string $str 被替换的字符串
 * @param initger $max 允许的最大长度
 * @param initger $end 从倒数第几个位置开始替换
 * @param string $expire 替换的字符串
 * @return string
 */
function sliceTailStr($str,$max=8,$end=2,$expire='.'){
	$len=mb_strlen($str);
	if($len <= $max) return $str;
	$newStr=mb_substr($str, 0, intval($max-$end),'utf-8');
	$tail=str_repeat($expire, $end);
	return $newStr.$tail;
}
/*********************以下时间函数******************************/
//将字符串数据转换成时间邮戳
function parseTime($v){
	return strtotime($v);
}
/**
 * 取当天一天中随机时间
 * @param $num		取多少次
 * @param $sort     true递增，false递减
 * 
 * @param $endHour	小时最大值
 * @param $minu		分钟最大值
 * @param $seco		秒最大值
 */
function rand_day($num=3,$day='',$month='',$year='',$sort=true,$startHour=1,$endHour=21,$startMinu=1,$endMinu=59,$startSeco=1,$endSeco=59){
	$time   = time();
	$day 	= !empty($day) ? $day : date('d',$time);
	$month  = !empty($month) ? $month : date('m',$time);
	$year   = !empty($year) ? $year : date('Y',$time);
	
	$hour=range($startHour, $endHour);
	$minu=range($startMinu, $endMinu);
	$seco=range($startSeco, $endSeco);
	
	$timeArr=[];
	for($i=$num;$i>0;$i--){
		$hour_index=array_rand($hour);
		$hour_val=$hour[$hour_index];
		unset($hour[$hour_index]);
		
		$minu_index=array_rand($minu);
		$minu_val=$minu[$minu_index];
		unset($minu[$minu_index]);
		
		$seco_index=array_rand($seco);
		$seco_val=$seco[$seco_index];
		unset($seco[$seco_index]);
		
		$timeStr= $year.'/'.$month.'/'.$day.' '.$hour_val.':'.$minu_val.':'.$seco_val;
		$timeArr[]=strtotime($timeStr);
	}
	$sort ? sort($timeArr) : rsort($timeArr) ;
	return $timeArr;
}
/**
 * 友好显示星期几
 */
function friend_w($time){
	$w=date('w',$time);
	switch($w){
		case '1':
			$rel='周一';
		break;
		case '2':
			$rel='周二';
		break;
		case '3':
			$rel='周三';
		break;
		case '4':
			$rel='周四';
		break;
		case '5':
			$rel='周五';
		break;
		case '6':
			$rel='周六';
		break;
		case '0':
		case '7':
			$rel='周末';
		break;
	}
	return $rel;
}
/**
 * 友好时间显示
 * @param $time
 * @return bool|string
 */
function friend_date($time){
    if (!$time)
        return false;
    $fdate = '';
    $d = time() - intval($time);
    $ld = $time - mktime(0, 0, 0, 0, 0, date('Y')); //得出年
    $md = $time - mktime(0, 0, 0, date('m'), 0, date('Y')); //得出月
    $byd = $time - mktime(0, 0, 0, date('m'), date('d') - 2, date('Y')); //前天
    $yd = $time - mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')); //昨天
    $dd = $time - mktime(0, 0, 0, date('m'), date('d'), date('Y')); //今天
    $td = $time - mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')); //明天
    $atd = $time - mktime(0, 0, 0, date('m'), date('d') + 2, date('Y')); //后天
    if ($d == 0) {
        $fdate = '刚刚';
    } else {
        switch ($d) {
            case $d < $atd:
                $fdate = date('Y年m月d日', $time);
                break;
            case $d < $td:
                $fdate = '后天' . date('H:i', $time);
                break;
            case $d < 0:
                $fdate = '明天' . date('H:i', $time);
                break;
            case $d < 60:
                $fdate = $d . '秒前';
                break;
            case $d < 3600:
                $fdate = floor($d / 60) . '分钟前';
                break;
            case $d < $dd:
                $fdate = floor($d / 3600) . '小时前';
                break;
            case $d < $yd:
                $fdate = '昨天' . date('H:i', $time);
                break;
            case $d < $byd:
                $fdate = '前天' . date('H:i', $time);
                break;
            case $d < $md:
                $fdate = date('m月d日 H:i', $time);
                break;
            case $d < $ld:
                $fdate = date('m月d日', $time);
                break;
            default:
                $fdate = date('Y年m月d日', $time);
                break;
        }
    }
    return $fdate;
}
/**
 * 获取当前时间整点，及后面的每隔$space秒的$num个整点，及其开始结束时间邮戳
 * @param $num 取当前整点后的多少个间隔时间
 * @param $space 间隔多少秒
 * @return $arr 二维数组
 */
function flash_time_space($num=6,$space=7200){
    $now_day = date('Y-m-d');
    $now_time = date('H');
    if ($now_time % 2 == 0) {
        $flash_now_time = $now_time;
    } else {
        $flash_now_time = $now_time - 1;
    }
    $flash_sale_time = strtotime($now_day . " " . $flash_now_time . ":00:00");
    for($i=1;$i<=$num;$i++){
    	$time_space[$i]=['font' => date("H:i", $flash_sale_time+(($i-1)*$space)), 'start_time' => $flash_sale_time + ($i*$space), 'end_time' => $flash_sale_time + ($i*$space)];
    }
    return $time_space;
}
//时间格式化1
function formatTime($time) {
    $now_time = time();
    $t = $now_time - $time;
    $mon = (int) ($t / (86400 * 30));
    if ($mon >= 1) {
        return '一个月前';
    }
    $day = (int) ($t / 86400);
    if ($day >= 1) {
        return $day . '天前';
    }
    $h = (int) ($t / 3600);
    if ($h >= 1) {
        return $h . '小时前';
    }
    $min = (int) ($t / 60);
    if ($min >= 1) {
        return $min . '分钟前';
    }
    return '刚刚';
}

//时间格式化2
function pincheTime($time) {
     $today  =  strtotime(date('Y-m-d')); //今天零点
      $here   =  (int)(($time - $today)/86400) ; 
      if($here==1){
          return '明天';  
      }
      if($here==2) {
          return '后天';  
      }
      if($here>=3 && $here<7){
          return $here.'天后';  
      }
      if($here>=7 && $here<30){
          return '一周后';  
      }
      if($here>=30 && $here<365){
          return '一个月后';  
      }
      if($here>=365){
          $r = (int)($here/365).'年后'; 
          return   $r;
      }
     return '今天';
}
/**
 * 返回当天一刻和最后一刻时间邮戳
 */
function getDay(){
	return [strtotime(date('Y',time()).'/'.date('m',time()).'/'.date('d',time()).' 00:00:00'),strtotime(date('Y',time()).'/'.date('m',time()).'/'.date('d',time()).' 23:59:59')];
}
/**
 * 返回某年某月的第一刻和最后一刻
 * @param integer 年份   默认当前年
 * @param integer 月份   默认当前月
 * @param booler 是否需要返回中文星期几
 * @return array 二维索引数组，分别是月初第一刻时间邮戳，中文时间描述，星期几
 */
function getMonth($year='',$month='',$chinaW=false){
	$year= !empty($year) ? $year : date('Y',time());
	$month= !empty($month) ? $month : date('m',time());
	$first=strtotime($year.'/'.$month.'/01 00:00:00');
	$fDate=date('Y.m.d H:i:s',$first);
	$fw=date('w',$first);
	if($month!=12){
		$last=strtotime($year.'/'.($month+1).'/01 00:00:00')-1;
	}else{
		$last=strtotime(($year+1).'/01/01 00:00:00')-1;
	}
	$lDate=date('Y.m.d H:i:s',$last);
	$lw=date('w',$last);
	$days=ceil(($last-$first)/(24*60*60));
	
	$num=0;
	$xiuxi=[];
	for($i=$first; $i<=$last;$i+=(24*60*60)){
		if(in_array(date('w',$i), [0,6])){
			$num++;
			$xiuxi[]=intval(date('d',$i));
		}
	}
	
	if($chinaW){
		$weekarray=["日","一","二","三","四","五","六"];
		return [
			'days'=>$days,
			'dates'=>[
				[$first,$fDate,$weekarray[$fw]],
				[$last,$lDate,$weekarray[$lw]]
				],
			'xiuxi'=>$num,
			'xiuxiday'=>$xiuxi,
			];
	}else{
		return [
			'days'=>$days,
			'dates'=>[
				[$first,$fDate,$fw],
				[$last,$lDate,$lw]
				],
			'xiuxi'=>$num,
			'xiuxiday'=>$xiuxi,
			];
	}
}
/**
 * 获取一整个月每天的日期与对应的星期
 * @param $year		年，默认当前年
 * @param $month	月，默认当前月
 * @return 返回一整个月日期与对应的星期二维数组，星期在前，日期在后
 */
function getDeclMonth($year='',$month='',$week=false){
	$year = !empty($year) ? $year : date('Y',time());
	$month= !empty($month) ? $month : date('m',time());
	$first=strtotime($year.'/'.$month.'/01 00:00:00');	//月第一天0时0分0秒时间邮戳
	if($month!=12){
		$last=strtotime($year.'/'.($month+1).'/01 00:00:00')-1;
	}else{
		$last=strtotime(($year+1).'/01/01 00:00:00')-1;
	}
	$arr=[];
	for($i=$first;$i<$last;$i+=86400){
		$arr[]=['d'=>date('d',$i),'w'=>date('w',$i),'stemp'=>$i,'etemp'=>$i+86399];
	}
	if($week){
		$fd=$arr[0]['w'];
		for($i=0;$i<$fd;$i++){
			array_unshift($arr,[]);
		}
		$fl=end($arr)['w'];
		for($y=6;$y>$fl;$y--){
			array_push($arr,[]);
		}
		$arr=array_chunk($arr,7);
	}
	return $arr;
}
function week(){
	$beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w'),date('Y'));
	$endLastweek=mktime(0,0,0,date('m'),date('d')+date('w'),date('Y'));
	return [$beginLastweek,$endLastweek];
}
function day(){
	$s=mktime(0,0,0,date('m'),date('d'),date('Y'));
	$e=mktime(23,23,23,date('m'),date('d'),date('Y'));
	return [$s,$e];
}
/****************************以下socike函数*************************************/
// 服务器端IP
 function serverIP(){
 	return gethostbyname($_SERVER["SERVER_NAME"]);   
 }
/**
 * CURL请求
 * @param $url 请求url地址
 * @param $method 请求方法 get post
 * @param null $postfields post数据数组
 * @param array $headers 请求header信息
 * @param bool|false $debug  调试开启 默认false
 * @return mixed
 */
function httpRequest($url, $method="GET", $postfields = null, $headers = array(), $debug = false) {
    $method = strtoupper($method);
    $ci = curl_init();
    /* Curl settings */
    curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
    curl_setopt($ci, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60); /* 在发起连接前等待的时间，如果设置为0，则无限等待 */
    curl_setopt($ci, CURLOPT_TIMEOUT, 7); /* 设置cURL允许执行的最长秒数 */
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
    switch ($method) {
        case "POST":
            curl_setopt($ci, CURLOPT_POST, true);
            if (!empty($postfields)) {
                $tmpdatastr = is_array($postfields) ? http_build_query($postfields) : $postfields;
                curl_setopt($ci, CURLOPT_POSTFIELDS, $tmpdatastr);
            }
            break;
        default:
            curl_setopt($ci, CURLOPT_CUSTOMREQUEST, $method); /* //设置请求方式 */
            break;
    }
    $ssl = preg_match('/^https:\/\//i',$url) ? TRUE : FALSE;
    curl_setopt($ci, CURLOPT_URL, $url);
    if($ssl){
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
        curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在
    }
    //curl_setopt($ci, CURLOPT_HEADER, true); /*启用时会将头文件的信息作为数据流输出*/
    curl_setopt($ci, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ci, CURLOPT_MAXREDIRS, 2);/*指定最多的HTTP重定向的数量，这个选项是和CURLOPT_FOLLOWLOCATION一起使用的*/
    curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ci, CURLINFO_HEADER_OUT, true);
    /*curl_setopt($ci, CURLOPT_COOKIE, $Cookiestr); * *COOKIE带过去** */
    $response = curl_exec($ci);
    $requestinfo = curl_getinfo($ci);
    $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
    if ($debug) {
        echo "=====post data======\r\n";
        var_dump($postfields);
        echo "=====info===== \r\n";
        print_r($requestinfo);
        echo "=====response=====\r\n";
        print_r($response);
    }
    curl_close($ci);
    return $response;
	//return array($http_code, $response,$requestinfo);
}

/****************************以下目录及文件函数*********************************/
/**
 * 循环删除目录和文件
 * @param string $dir_name
 * @return bool
 */
function delete_dir_file($dir_name) {
    $result = false;
    if(is_dir($dir_name)){
        if ($handle = opendir($dir_name)) {
            while (false !== ($item = readdir($handle))) {
                if ($item != '.' && $item != '..') {
                    if (is_dir($dir_name . DS . $item)) {
                        delete_dir_file($dir_name . DS . $item);
                    } else {
                        unlink($dir_name . DS . $item);
                    }
                }
            }
            closedir($handle);
            if (rmdir($dir_name)) {
                $result = true;
            }
        }
    }
    return $result;
}
 /**
  * 自定义函数递归的复制带有多级子目录的目录
  * 递归复制文件夹
  * @param type $src 原目录
  * @param type $dst 复制到的目录
  */
function recurse_copy($src, $dst){
	$now = time();
	$dir = opendir($src);
	@mkdir($dst);
	while (false !== $file = readdir($dir)) {
		if (($file != '.') && ($file != '..')) {
			if (is_dir($src . '/' . $file)) {
				recurse_copy($src . '/' . $file, $dst . '/' . $file);
			}
			else {
				if (file_exists($dst . DIRECTORY_SEPARATOR . $file)) {
					if (!is_writeable($dst . DIRECTORY_SEPARATOR . $file)) {
						exit($dst . DIRECTORY_SEPARATOR . $file . '不可写');
					}
					@unlink($dst . DIRECTORY_SEPARATOR . $file);
				}
				if (file_exists($dst . DIRECTORY_SEPARATOR . $file)) {
					@unlink($dst . DIRECTORY_SEPARATOR . $file);
				}
				$copyrt = copy($src . DIRECTORY_SEPARATOR . $file, $dst . DIRECTORY_SEPARATOR . $file);
				if (!$copyrt) {
					echo 'copy ' . $dst . DIRECTORY_SEPARATOR . $file . ' failed<br>';
				}
			}
		}
	}
	closedir($dir);
}
/**
 * 递归创建目录
 */
function makeDir($dir){
   return  is_dir ( $dir ) or makeDir(dirname( $dir )) and  mkdir ( $dir , 0777);
}
// 递归删除文件夹
function delFile($path,$delDir = FALSE) {
    if(!is_dir($path))
                return FALSE;		
	$handle = @opendir($path);
	if ($handle) {
		while (false !== ( $item = readdir($handle) )) {
			if ($item != "." && $item != "..")
				is_dir("$path/$item") ? delFile("$path/$item", $delDir) : unlink("$path/$item");
		}
		closedir($handle);
		if ($delDir) return rmdir($path);
	}else {
		if (file_exists($path)) {
			return unlink($path);
		} else {
			return FALSE;
		}
	}
}

/****************************以下检查+加密+解密函数*********************************/
/**
 * 验证身份证
 */
function isIdCard($number) {
    //加权因子 
    $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
    //校验码串 
    $ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
    //按顺序循环处理前17位 
    $sigma=0;
    for ($i = 0;$i < 17;$i++) { 
        //提取前17位的其中一位，并将变量类型转为实数 
        $b = (int) $number{$i}; 
 
        //提取相应的加权因子 
        $w = $wi[$i]; 
 
        //把从身份证号码中提取的一位数字和加权因子相乘，并累加 
        $sigma += $b * $w; 
    }
    //计算序号 
    $snumber = $sigma % 11; 
 
    //按照序号从校验码串中提取相应的字符。 
    $check_number = $ai[$snumber];
 
    if ($number{17} == $check_number) {
        return true;
    } else {
        return false;
    }
}
/**
 * 检查手机号码格式
 * @param $mobile 手机号码
 */
function check_mobile($mobile){
    if(preg_match('/1[34578]\d{9}$/',$mobile))
        return true;
    return false;
}
/**
 * 检查固定电话
 * @param $mobile
 * @return bool
 */
function check_telephone($mobile){
    if(preg_match('/^([0-9]{3,4}-)?[0-9]{7,8}$/',$mobile))
        return true;
    return false;
}
/**
 * 检查邮箱地址格式
 * @param $email 邮箱地址
 */
function check_email($email){
    if(filter_var($email,FILTER_VALIDATE_EMAIL))
        return true;
    return false;
}
/**
 * 判断当前访问的用户是  PC端  还是 手机端  返回true 为手机端  false 为PC 端
 * @return boolean
 */
function isMobile(){
        // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))	return true;
    
    if (isset ($_SERVER['HTTP_VIA'])){	// 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    	return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;	// 找不到为flase,否则为true
    }
    if (isset ($_SERVER['HTTP_USER_AGENT'])){	// 脑残法，判断手机发送的客户端标志,兼容性有待提高
        $clientkeywords = array ('nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile');
        // 从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT'])))
            return true;
    }
        // 协议法，因为有可能不准确，放到最后判断
    if (isset ($_SERVER['HTTP_ACCEPT'])){
    // 如果只支持wml并且不支持html那一定是移动设备
    // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))))
        {
            return true;
        }
    }
            return false;
 }
/**
 * 检测是否是微信端
 */
function is_weixin() {
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
        return true;
    } return false;
}
/**
 * 检测是否是QQ
 */
function is_qq() {
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'QQ') !== false) {
        return true;
    } return false;
}
/**
 * 检测是否是阿里巴巴
 */
function is_alipay() {
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'AlipayClient') !== false) {
        return true;
    } return false;
}


function ajaxReturn($data){
    header('Content-Type:application/json; charset=utf-8');
    exit(json_encode($data));
}

/**
 * 验证码操作(不生成图片)
 * @param array $inconfig  配置
 * @param sring $id 要生成验证码的标识 
 * @param string $incode 验证码,若为null生成验证码,否则检验验证码
 */
function capache($inconfig = [], $id = '', $incode = null){  
    $config = array(
        'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
        'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合
        'expire'    =>  1800,            // 验证码过期时间（s）
        'useZh'     =>  false,           // 使用中文验证码 
        'zhSet'     =>  '们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借',              // 中文验证码字符串
        'length'    =>  4,               // 验证码位数
        'reset'     =>  true,           // 验证成功后是否重置
    );
    $config = array_merge($config, $inconfig);
    $authcode = function ($str) use ($config) {
        $key = substr(md5($config['seKey']), 5, 8);
        $str = substr(md5($str), 8, 10);
        return md5($key . $str);
    };

    /* 生成验证码 */
    if ($incode === null) {
        for ($i = 0; $i<$config['length']; $i++) {
            $code[$i] = $config['codeSet'][mt_rand(0, strlen($config['codeSet'])-1)];
        }
        // 保存验证码
        $code_str   =   implode('', $code);
        $key        =   $authcode($config['seKey']);
        $code       =   $authcode(strtoupper($code_str));
        $secode     =   array();
        $secode['verify_code'] = $code; // 把校验码保存到session
        $secode['verify_time'] = NOW_TIME;  // 验证码创建时间
        session($key.$id, $secode);
        return $code_str;
    } 

    /* 检验验证码 */
    if (is_string($incode)) {
        $key = $authcode($config['seKey']).$id;
        // 验证码不能为空
        $secode = session($key);
        if (empty($incode) || empty($secode)) {
            return false;
        }
        // session 过期
        if (NOW_TIME - $secode['verify_time'] > $config['expire']) {
            session($key, null);
            return false;
        }

        if ($authcode(strtoupper($incode)) == $secode['verify_code']) {
            $config['reset'] && session($key, null);
            return true;
        }
        return false;
    }

    return false;
}
//生成短网址
function code62($x){
	$show='';
	while($x>0){
		$s=$x % 62;
		if ($s>35){
			$s=chr($s+61);
		}elseif($s>9&&$s<=35){
			$s=chr($s+55);
		}
		$show.=$s;
		$x=floor($x/62);
	}
	return $show;
}
//生成短链接
function shorturl($url){
	$url=crc32($url);
	$result=sprintf("%u",$url);
	return code62($result);
}

//DES加密
function do_mencrypt($string, $key=''){
	$key= !empty($key) ? $key : config('qxb.key');
	/*$input = str_replace("\n", "", $input);
	$input = str_replace("\t", "", $input);
	$input = str_replace("\r", "", $input);
	$key = substr(md5($key), 0, 24);
	$td = mcrypt_module_open('tripledes', '', 'ecb', '');
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$encrypted_data = mcrypt_generic($td, $input);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return trim(chop(base64_encode($encrypted_data)));*/
	$operation = 'E';
   	$key=md5($key); 
  	$key_length=strlen($key); 
   	$string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string; 
  	$string_length=strlen($string); 
  	$rndkey=$box=array(); 
  	$result=''; 
  	for($i=0;$i<=255;$i++){
  		$rndkey[$i]=ord($key[$i%$key_length]); 
    	$box[$i]=$i; 
  	} 
	for($j=$i=0;$i<256;$i++){ 
	    $j=($j+$box[$i]+$rndkey[$i])%256; 
	    $tmp=$box[$i]; 
	    $box[$i]=$box[$j]; 
	    $box[$j]=$tmp; 
	} 
	for($a=$j=$i=0;$i<$string_length;$i++){
	  	$a=($a+1)%256; 
	    $j=($j+$box[$a])%256; 
	    $tmp=$box[$a]; 
	    $box[$a]=$box[$j]; 
	    $box[$j]=$tmp; 
	    $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256])); 
	}
	if($operation=='D'){
		if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){
			return substr($result,8); 
	    }else{
	    	return''; 
	    } 
	}else{ 
	    return str_replace('=','',base64_encode($result)); 
	} 
}
//DES解密
function do_mdecrypt($string, $key=''){
	$key= !empty($key) ? $key : config('qxb.key');
	$operation = 'D';
   $key=md5($key); 
  $key_length=strlen($key); 
   $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string; 
  $string_length=strlen($string); 
  $rndkey=$box=array(); 
  $result=''; 
  for($i=0;$i<=255;$i++){ 
      $rndkey[$i]=ord($key[$i%$key_length]); 
    $box[$i]=$i; 
  } 
  for($j=$i=0;$i<256;$i++){ 
    $j=($j+$box[$i]+$rndkey[$i])%256; 
    $tmp=$box[$i]; 
    $box[$i]=$box[$j]; 
    $box[$j]=$tmp; 
  } 
  for($a=$j=$i=0;$i<$string_length;$i++){ 
    $a=($a+1)%256; 
    $j=($j+$box[$a])%256; 
    $tmp=$box[$a]; 
    $box[$a]=$box[$j]; 
    $box[$j]=$tmp; 
    $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256])); 
  } 
  if($operation=='D'){ 
    if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){ 
      return substr($result,8); 
    }else{ 
      return''; 
    } 
  }else{ 
    return str_replace('=','',base64_encode($result)); 
  } 
}

/***************************图片函数***********************************/
function urlsafe_b64encode($string){
    $data = base64_encode($string);
    $data = str_replace(array('+','/','='),array('-','_',''),$data);
    return $data;
}
/********************以下辅助函数********************************/
/**
 * 根据id获取地区名字
 * @param $regionId id
 */
//function getAreaName($regionId){
//  $data = M('region')->where(array('id'=>$regionId))->field('name')->find();
//  return $data['name'];
//}
/**
 * 容联短信
$to: 短信接收手机号码集合,用英文逗号分开,如 '13810001000,13810011001',最多一次发送200个。
$datas：内容数据，需定义成数组方式，如模板中有两个参数，定义方式为array（'场景','3456','123'）。
$tempId: 模板Id,如使用测试模板，模板id为1，如使用自己创建的模板，则使用自己创建的短信模板id即可。
 */
function sendRlTemplateSMS($to, $datas, $tempId) {
	//Loader::import("ronglian.CCPRestSmsSDK", EXTEND_PATH);
	Loader::import('ronglian.CCPRestSmsSDK',VENDOR_PATH);
	// 初始化REST SDK
	$accountSid = '8aaf070856e89cad0156e99d02e501bf';
	$accountToken = '4b2343d898dd47618fea247f778e3dab';
	$appId = '8aaf070856e89cad0156e99d03d401c4';
	$serverIP = 'app.cloopen.com';
	$serverPort = '8883';
	$softVersion = '2013-12-26';
	$rest = new \REST($serverIP, $serverPort, $softVersion);
	$rest->setAccount($accountSid, $accountToken);
	$rest->setAppId($appId);

	// 发送模板短信
	// echo "Sending TemplateSMS to $to <br/>";
	$result = $rest->sendTemplateSMS($to, $datas, $tempId);
	if ($result == null) {
		// echo "result error!";
		return ['code' => -1, 'msg' => 'result error!'];
	}
	if ($result->statusCode != 0) {
		// echo "error code :" . $result->statusCode . "<br>";
		// echo "error msg :" . $result->statusMsg . "<br>";
		$data = ['code' => -1, 'msg' => $result->statusCode . ':' . $result->statusMsg];
		return $data;
		//TODO 添加错误逻辑
	} else {
		// echo "Sendind TemplateSMS success!<br/>";
		// 获取返回信息
		$smsmessage = $result->TemplateSMS;
		// echo "dateCreated:".$smsmessage->dateCreated."<br/>";
		// echo "smsMessageSid:".$smsmessage->smsMessageSid."<br/>";
		//TODO 添加成功逻辑
		return true;
	}
}

function test($money_total,$day,$min_money=1){
	
	$personal_num=count($day);
	$money_right=$money_total;
	$randMoney=[];
	for($i=1;$i<=$personal_num;$i++){
	    if($i== $personal_num){
	        $money=$money_right;
	    }else{
//	        $max=$money_right*100 - ($personal_num - $i ) * $min_money *100;
//	        $money= rand($min_money*100,$max) /100;
//	        $money=sprintf("%.2f",$money);
//			$money=sprintf("%.2f",$money);
			$max=$money_right - ($personal_num - $i ) * $min_money;
	        $money= rand($min_money,$max);
	    }
        $randMoney[]=$money;
        $money_right=$money_right - $money;
//      $money_right=sprintf("%.2f",$money_right);
//      $money_right=sprintf("%.2",$money_right);
	}
	shuffle($randMoney);
	return $randMoney;
}
function b($total,$div){
//	$total=100;
	$a=range(0,$div-1);
	$base=($total-array_sum($a))/$div;
	for($len=count($a),$i=0; $i<$len; $i++){
	    $a[$i]+=$base;
	}
	return $a;
}
/**
 * 分隔一个数
 */
function randnum($total,$div,$area=50){
   $total = $total; //待划分的数字
   $div = $div; //分成的份数
// $area = 50; //各份数间允许的最大差值
   $average = round($total / $div);
   $sum = 0;
   $result = array_fill( 1, $div, 0 );
     
   for( $i = 1; $i < $div; $i++ ){
    //根据已产生的随机数情况，调整新随机数范围，以保证各份间差值在指定范围内
    if( $sum > 0 ){
     $max = 0;
     $min = 0 - round( $area / 2 );
    }elseif( $sum < 0 ){
     $min = 0;
     $max = round( $area / 2 );
    }else{
     $max = round( $area / 2 );
     $min = 0 - round( $area / 2 );
    }
     
    //产生各份的份额
    $random = rand( $min, $max );
    $sum += $random;
    $result[$i] = $average + $random;
   }
     
   //最后一份的份额由前面的结果决定，以保证各份的总和为指定值
   $result[$div] = $average - $sum;
   foreach( $result as $temp ){
   $data[]=$temp;
   }
   return $data;
}
/**
 * 获取两点之间距离
 * @param $longitude1	经度1
 * @param $latitude1    纬度1
 * @param $longitude2	经度2
 * @param $latitude2	纬度2
 * @param $unit			单位。1：米，2：千米
 * @param $decimal		经度，保留小数点后几位
 * @return 距离
 */
function getDistance($longitude1,$latitude1,$longitude2,$latitude2,$unit=2,$decimal=2){
		$EARTH_RADIUS = 6370.996;
		$PI = 3.1415926;
		$radLat1 = $latitude1 * $PI / 180.0;
		$radLat2 = $latitude2 * $PI / 180.0;
		
		$radLng1 = $longitude1 * $PI / 180.0;
		$radLng2 = $longitude2 * $PI / 180.0;
		
		$a = $radLat1 - $radLat2;
		$b = $radLng1 - $radLng2;
		$distance = 2 * asin(sqrt(pow(sin($a/2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2), 2)));
		$distance = $distance * $EARTH_RADIUS * 1000;
		if($unit==2){
			$distance = $distance / 1000;
		}
		return round($distance,$decimal);
}
//function getRandList($total,$run_day,$result=[]){
//		$div	 = count($run_day);				//分割数量
//		$average = round($total / $div);		//总金额平均值，舍余进一
//		$area	 = $average;			//偏移量
//		foreach($run_day as $k=>$v){
//			if($k<$div-1){
//				$min= -round($area/2);
//				$max= round($area/2);
//				$random = rand( $min, $max );
//	    		$result[$v] = $average + $random;
//			}
//		}
//	    $result[max($run_day)] = $total - array_sum(array_values($result));
//		foreach($result as $item){
//			if($item<=0){
//				echo 1;
//				getRandList($total,$run_day,$result);
//			}
//		}
//		return $result;
//	}